package edu.scau.mis.core.oss.config;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import edu.scau.mis.core.oss.storage.IStorage;
import edu.scau.mis.core.oss.storage.impl.AliyunStorage;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
//作用：标记一个类为配置类，相当于 Spring 的 XML 配置文件。配置类中可以定义 @Bean 方法，用于注册 Bean。
@ConditionalOnProperty(prefix = "oss.aliyun", name = "active", havingValue = "true")

@ConditionalOnClass(OSSClient.class)//当指定的类存在于类路径中时，才加载某个配置类或 Bean。
//@ConditionalOnProperty
//作用：根据配置文件中的属性值来决定是否加载某个配置类或 Bean。
//使用场景：当某个属性存在或具有特定值时，才启用某个配置。
//常用属性：
//prefix：属性的前缀。
//name：属性的名称。
//havingValue：属性的值，只有匹配时才生效。
//matchIfMissing：如果属性不存在，是否默认加载（默认为 false）。

public class AliyunConfiguration {                  //用于配置阿里云相关的 Bean，并将OSS客户端传递给AliyunStorage执行相应功能
    @Bean
    @Qualifier("aliyunStorage")
    IStorage aliyunStorage(OssProperties ossProperties) {
       OssProperties.Aliyun aliyun = ossProperties.getAliyun();//aliyun维护了endpoint,bucketName.ID.key等
        // 实例化方式一
        // 使用 OssProperties 中的配置创建 OSS 客户端
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(aliyun.getAccessKeyId(),aliyun.getAccessKeySecret());
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(aliyun.getEndpoint())     //@ConditionalOnClass(OSSClient.class)
                .credentialsProvider(credentialsProvider)
                .build();

        // 实例化方式二
//        OSS ossClient = new OSSClientBuilder()
//                .build(aliyun.getEndpoint(),
//                        aliyun.getAccessKeyId(),
//                        aliyun.getAccessKeySecret());

        return new AliyunStorage(ossClient);//将OSS客户端传递给AliyunStorage执行相应功能
    }

}


